ホームに戻る
出典 :
目次 :
アプリケーションからフォームを開く
Form.Show() または Form.ShowDialog() でフォームを開くことができる。
その際、いずれを用いるかでタスクの挙動が異なる。
開く際のメソッド |
フォームの形態 |
Form.Show() |
モードレス(非同期) |
別タスクとして開くため、元アプリケーションの処理が継続される |
Form.ShowDialog() |
モーダル(同期) |
フォームを閉じるまでの間、元アプリケーションの処理が中断される |
サンプルコード : モードレス
元アプリケーションと開かれたフォームの両タスクは並行する。
即ち、Form.Show() をコールした直後、後続行がすぐに実行される。
// フォームインスタンス生成
Form_Sub form_Sub = new Form_Sub();
// form_Sub をモードレスダイアログとして開く
form_Sub.Show();
// form_Sub を開いた直後に、後続行が実行される
// (form_Sub を閉じたかは問われない)
Hoge();
Fuga();
:
サンプルコード : モーダル
フォームは元アプリケーションのタスク内で実行される。
即ち、Form.ShowDialog() をコール後、フォームを閉じるまで後続行は実行されない。
( Form.ShowDialog() はフォームを閉じるまで完了しない。)
// フォームインスタンス生成
Form_Sub form_Sub = new Form_Sub();
// form_Sub をモーダルダイアログとして開く
form_Sub.ShowDialog();
// form_Sub を閉じるまで後続行は実行されない
Hoge();
Fuga();
:
フォームの処理結果(DialogResult)
フォームの処理結果を DialogResult プロパティ( DialogResult 型)から参照することができる。
DialogResult の確定
public partial class Form_Sub : Form
{
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
// コンストラクタ
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
public Form_Sub()
{
InitializeComponent();
}
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
// ボタン「はい」クリック時の処理
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
private void button_Yes_Click(object sender, EventArgs e)
{
// プロパティ DialogResult を更新 ⇒ フォームが閉じる
DialogResult = DialogResult.Yes;
}
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
// ボタン「いいえ」クリック時の処理
// - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
private void button_No_Click(object sender, EventArgs e)
{
// プロパティ DialogResult を更新 ⇒ フォームが閉じる
DialogResult = DialogResult.No;
}
}
DialogResult プロパティの初期値は DialogResult.None 。
フォームがモーダルの場合、DialogResult プロパティの値を更新すると自動的にフォームが閉じられるため、
Close() を明示的にコールする必要は無い。
DialogResult を元アプリケーションから参照
// フォームインスタンス生成
Form_Sub form_Sub = new Form_Sub();
// form_Sub をモーダルダイアログとして開く
form_Sub.ShowDialog();
// form_Sub の実行結果(DialogResult)を参照
if (form_Sub.DialogResult == DialogResult.No)
{
return;
}
:
フォームインスタンスを再利用しないのであれば、以下のように簡略化可能。
( ShowDialog() は DialogResult プロパティを戻り値として返す。)
// Form_Sub を開いて実行結果(DialogResult)を取得
if (new Form_Sub().ShowDialog() == DialogResult.No)
{
return;
}
:
フォームの実行結果を参照する場合、通常はフォームをモーダルで開く( ShowDialog() )。
上記のコードでは Form_Sub を閉じるまで後続の処理( if 文以降)が行われないため、単純な処理で DialogResult を確定させてから判定することができる。
フォームをモーダルで開い( Show() )た場合、DialogResult は戻り値としては得られない。
モードレスダイアログの DialogResult を参照するには、元アプリからのポーリングや、
フォームからイベントを発行する(フォームが閉じられたことを通知する)などの機構を用意する必要がある。詳細は割愛。
DialogResult 型の取りうる値(一例)
DialogResult.None | 結果が設定されていない状態(デフォルト) |
DialogResult.Cancel | 主に「キャンセル」ボタン押下時 |
DialogResult.OK | 主に「OK」ボタン押下時 |
DialogResult.Yes | 主に「はい」ボタン押下時 |
DialogResult.No | 主に「いいえ」ボタン押下時 |